#! /bin/sh
# Autodetection script for scanning /sys for hardware
# for Archlinux by Tobias Powalowski <tpowa@archlinux.org>
# '--modules-not-loaded' patch by Grzegorz Wierzowiecki <grzegorz.wierzowiecki_4t_pjwstk.edu.pl>
usage () {
	echo "$0 [options]"
	echo ""
	echo " This is a tool that detects/lists modules that are exported by /sys"
	echo ""
	echo "  Options:"
	echo "    --kernel_version=      use kernel version (no autodetect)"
	echo "    --kernel_directory=    use kernel module directory (no autodetect)"
	echo "    --load-modules         load all detected modules"
	echo "    --unload-modules       unload all detected modules"
	echo "    --show-modules         show all detected modules"
	echo "    --show-modules-order   shows load order of detected modules"
	echo "    --show-agp             show AGP modules"
	echo "    --show-acpi            show ACPI modules"
        echo "    --show-block           show BLOCK DEVICE modules"
	echo "    --show-net             show NETWORK modules"
	echo "    --show-drm             show DRM modules"
	echo "    --show-input           show INPUT modules"
	echo "    --show-irda            show IRDA modules"
	echo "    --show-isdn            show ISDN modules"
	echo "    --show-pcmcia          show PCMCIA modules"
	echo "    --show-sound           show SOUND modules"
	echo "    --show-staging         show STAGING modules"
	echo "    --show-other           show OTHER modules"
	echo "    --modules              show all detected MODULES"
	echo "    --modules-not-loaded   show all detected MODULES but not actually loaded"
	echo ""
	echo "  For /etc/mkinitcpio.conf use:"
	echo "    --filesystem           add filesystems to MODULES="
	echo "    --hostcontroller       show MODULES= for all hostcontrollers"
	echo "    --ati-kms              add ati kernel mode setting" 
	echo "    --intel-kms            add intel kernel mode setting"
	echo "    --nvidia-kms           add nvidia kernel mode setting"
        echo "" 
	echo "    --rootdevice=          autodetected advanced features of rootdevice"
	echo "    --hooks-dir=           use this directory for HOOKS check"
	echo "    --advanced             show autodetected advanced HOOKS"
	echo "    --hooks                show HOOKS="
	echo "    --dmraid               add dmraid to HOOKS="
	echo "    --keymap               add keymap to HOOKS="
	echo "    --pcmcia               add pcmcia to HOOKS="
	echo "    --nfs                  add net to HOOKS="
	echo "    --btrfs                add btrfs to HOOKS="
	echo "    --shutdown             add shutdown to HOOKS="
	exit 1
}

[ "$1" = "" ]       && usage
[ "$1" = "--help" ] && usage
[ "$1" = "-h" ]     && usage

# setting parameters
PARAMETER="$(echo $*)"
parameter() {
	while [ -n "$1" ]; do
		case $1 in
			--kernel_directory=*)
			KERNEL_DIRECTORY="$(echo $1 | awk -F= '{print $2;}')"
			;;
			--kernel_version=*)
			KERNEL_VERSION="$(echo $1 | awk -F= '{print $2;}')"
			;;
			--rootdevice=*)
			ROOTDEVICE="$(echo $1 | awk -F= '{print $2;}')"
			;;
			-hooks-dir=*|--hooks-dir=*)
			HOOKS_DIR="$(echo $1 | awk -F= '{print $2;}')"
			;;
		esac
		shift
	done
}

parameter $PARAMETER

if [ "$KERNEL_VERSION" = "" ]; then
	KERNEL_VERSION="$(uname -r)"
fi

# uvesafb switch
[ "$(echo $* | grep '\-uvesafb')" ] && UVESAFB=1

# dmraid switch
[ "$(echo $* | grep '\-dmraid')" ] && DMRAID=1

# keymap switch
[ "$(echo $* | grep '\-keymap')" ] && KEYMAP=1

# pcmcia switch
[ "$(echo $* | grep '\-pcmcia')" ] && PCMCIA=1

# nfs switch
[ "$(echo $* | grep '\-nfs')" ] && NFS=1

# btrfs switch
[ "$(echo $* | grep '\-btrfs')" ] && BTRFS=1

# shutdown switch
[ "$(echo $* | grep '\-shutdown')" ] && SHUTDOWN=1

# hooks switch
[ "$(echo $* | grep '\-hooks')" ] && HOOKS=1

ADVANCED=""
# root device check
if ! [ "$ROOTDEVICE" = "" ]; then
        # check device mapper devices
	if [ "$(echo "$ROOTDEVICE" | grep "/dev/mapper")" ]; then
		# check if encryption is used
		if [ "$(cryptsetup status $ROOTDEVICE 2>/dev/null)" ]; then
			ADVANCED="encrypt"
			# check on lvm
			realdevice="$(cryptsetup status $ROOTDEVICE 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
			if [ "$(lvs $realdevice 2>/dev/null)" ]; then
				ADVANCED="lvm2 encrypt"
				vg="$(echo $(lvs -o vg_name --noheading $realdevice))"
				# check on raid
				[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")" ] && ADVANCED="mdadm lvm2 encrypt"
			fi
			# check on raid
			if [ "$(cryptsetup status $ROOTDEVICE 2>/dev/null | grep "device:.*/dev/md" | sed -e 's#.*\ ##g')" ]; then
				ADVANCED="mdadm encrypt"
				realdevice="$(cryptsetup status $ROOTDEVICE 2>/dev/null | grep "device:.*/dev/md" | sed -e 's#.*\ ##g')"
				# check on lvm
				[ "$(mdadm --detail $realdevice | grep "/dev/dm-")" ] && ADVANCED="lvm2 mdadm encrypt"
			fi
		fi
		# check if lvm is used
		if [ "$(lvs $ROOTDEVICE 2>/dev/null)" ]; then
			ADVANCED="lvm2"
			vg="$(echo $(lvs -o vg_name --noheading $ROOTDEVICE))"
			# check on encrypt
			if [ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ]; then 
				ADVANCED="encrypt lvm2"
				# check on raid
				[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")" ] && ADVANCED="mdadm encrypt lvm2"
				for i in "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")"; do
					realdevice="$(echo $i | cut -d ' ' -f1)"
					#getsymlink="$(readlink $realdevice)"
					#correctdevice="$(echo $getsymlink | sed -e 's#\.\.#/dev#g')"
					[ "$(cryptsetup status $realdevice 2>/dev/null | grep "device:.*/dev/md")" ] && ADVANCED="mdadm encrypt lvm2"
				done
			fi
			# check on raid
			if [ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")" ]; then
				ADVANCED="mdadm lvm2"
				#check on encrypt
				[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ] && ADVANCED="encrypt mdadm lvm2"
				for i in "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/md")"; do
					realdevice="$(echo $i | cut -d ' ' -f1)"
					[ "$(mdadm --detail $realdevice | grep "/dev/dm-")" ] && ADVANCED="encrypt mdadm lvm2"
				done
			fi
		fi
	fi
	# check md device
	if [ "$(echo "$ROOTDEVICE" | grep "/dev/md")" ]; then
		ADVANCED="mdadm"
		# raid partitions or raid?
		if [ "$(echo "$ROOTDEVICE" | grep "/dev/md*p")" ]; then
			realdevice="$(echo $ROOTDEVICE | sed -e 's#p.*##g' -e 's#/dev/##g')"
			if ! [ "$(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null)" = "" ]; then
				SET_LVM=""
				SET_ENCRYPT=""
				for k in $(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null); do
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && SET_LVM="1"
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && SET_ENCRYPT="1"
					# check on lvm
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="lvm2 mdadm"
					# check on encrypt
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="encrypt mdadm"
					# check encrypted volume device
					realdevice="$(cryptsetup status $(cat $k/dm/name) 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
					[ "$(lvs $realdevice 2>/dev/null)" ] && ADVANCED="lvm2 encrypt mdadm"
					vg="$(echo $(lvs -o vg_name --noheading /dev/mapper/$(cat $k/dm/name) 2>/dev/null))"
					[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ] && ADVANCED="encrypt lvm2 mdadm"
				done
				[ "$SET_LVM" = "1" -a "$SET_ENCRYPT" = "1" ] && ADVANCED="lvm2 encrypt mdadm"
			fi
		else
			realdevice="$(echo $ROOTDEVICE | sed -e 's#/dev/##g')"
			if ! [ "$(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null)" = "" ]; then
				SET_LVM=""
				SET_ENCRYPT=""
				for k in $(find /sys/block/$realdevice/slaves/ -name 'dm*' 2>/dev/null); do
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && SET_LVM="1"
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && SET_ENCRYPT="1"
					# check on lvm
					[ "$(lvs /dev/mapper/$(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="lvm2 mdadm"
					# check on encrypt
					[ "$(cryptsetup status $(cat $k/dm/name) 2>/dev/null)" ] && ADVANCED="encrypt mdadm"
					# check encrypted volume device
					realdevice="$(cryptsetup status $(cat $k/dm/name) 2>/dev/null | grep "device:.*/dev/mapper/" | sed -e 's#.*\ ##g')"
					[ "$(lvs $realdevice 2>/dev/null)" ] && ADVANCED="lvm2 encrypt mdadm"
					vg="$(echo $(lvs -o vg_name --noheading /dev/mapper/$(cat $k/dm/name) 2>/dev/null))"
					[ "$(pvs -o pv_name,vg_name --noheading | grep "$vg$" | grep "/dev/dm-")" ] && ADVANCED="encrypt lvm2 mdadm"
				done
				[ "$SET_LVM" = "1" -a "$SET_ENCRYPT" = "1" ] && ADVANCED="lvm2 encrypt mdadm"
			fi
		fi
	fi
fi

: >/tmp/modules-plain
: >/tmp/modules-stripped
: >/tmp/modules-sorted
: >/tmp/moduleslist
: >/tmp/.blkid

# generate blkid
blkid -c /dev/null -s TYPE > /tmp/.blkid

# find pci aliases
aliases=$(find /sys/ -noleaf -name modalias  -exec cat {} +)

# generate files for the different actions
modprobe -i -a --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends $aliases >> /tmp/modules-plain 2>/dev/null

# find PNP devices like parports, soundcards etc.
#   (workaround for rtc, pcspkr, irtty-sir and analog are included)
if [ "$(find /sys/devices -noleaf -name 'id' | grep /pnp)" ]; then
	for i in $(find /sys/devices -noleaf -name "id" | grep /pnp); do
		devid=$(cat $i | grep PNP)
		[ "$devid" ] || continue
	
		modprobe -i --set-version=$KERNEL_VERSION --show-depends pnp:d${devid} >> /tmp/modules-plain 2>/dev/null
		[ "$devid" = "PNP0800" ] && modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends pcspkr >> /tmp/modules-plain  2>/dev/null
		[ "$devid" = "PNP0510" ] && modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends irtty-sir >> /tmp/modules-plain 2>/dev/null
		[ "$devid" = "PNP0511" ] && modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends irtty-sir >> /tmp/modules-plain 2>/dev/null
		[ "$devid" = "PNPb02f" ] && modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends analog >> /tmp/modules-plain 2>/dev/null

		# load ppp-generic if serial ports are detected for modems
		[ "$devid" = "PNP0501" ] && modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends ppp-generic >> /tmp/modules-plain 2>/dev/null
	done
fi

# SCSI disks/cdroms/tapes/generic devices
if [ "$(find /sys/devices -noleaf -name 'type')" ]; then
	for i in $(cat $(find /sys/devices -noleaf -name "type")); do
		case $i in (4|5)       modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends sr_mod >> /tmp/modules-plain 2>/dev/null ;; esac
		case $i in (2|3|6|8|9) modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends sg >> /tmp/modules-plain 2>/dev/null ;; esac
		case $i in (0|7|14)    modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends sd_mod >> /tmp/modules-plain 2>/dev/null ;; esac
		case $i in (1)         modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends st >> /tmp/modules-plain 2>/dev/null ;; esac
	done
fi

# add Buslogic for vmware
if [ "$VMWARE" = "1" ]; then
	 modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends BusLogic >> /tmp/modules-plain 2>/dev/null
fi

# Parport modules
if [ "$(grep 'parport' /tmp/modules-plain)" ]; then
	modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends lp >> /tmp/modules-plain 2>/dev/null
	modprobe -i --dirname=$KERNEL_DIRECTORY --set-version=$KERNEL_VERSION --show-depends ppdev >> /tmp/modules-plain 2>/dev/null
fi

sort -u /tmp/modules-plain >> /tmp/modules-stripped

# OTHER modules loading first for speed up!
grep -v "scsi/" /tmp/modules-stripped | grep -v "fusion/" | grep -v "block/sx8" | grep -v "message/fusion" | \
	grep -v  "block/cciss" | grep -v "block/cpqarray" | grep -v "block/DAC960" | grep -v "block/virtio" | grep -v "ata/" | \
	grep -v "net/" | grep -v "pcmcia/" | grep -v "usb/" | \
	grep -v "firewire" | grep -v "ieee1394/" | grep -v "usbhid/" | grep -v "staging/" | grep -v "wireless/" | grep -v "virtio_pci" >> /tmp/modules-sorted
# load virtio first!
grep "virtio_pci" /tmp/modules-stripped  >> /tmp/modules-sorted
# make a correct order for the modules, internal devices have priority!
grep "ata/pata" /tmp/modules-stripped | grep -v "pata_acpi" >> /tmp/modules-sorted
grep "scsi/" /tmp/modules-stripped  | grep -v "sd_mod" | grep -v "sr_mod" | grep -v "/sg.ko" | grep -v "/st.ko" >> /tmp/modules-sorted
grep "block/" /tmp/modules-stripped | grep -v "virtio_blk" | grep -v "sx8" | grep -v "nbd" | grep -v "pktcdvd" | grep -v "floppy" >> /tmp/modules-sorted
grep "fusion/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "ata/"  /tmp/modules-stripped| grep -v "pata" | grep -v "ata_generic" | grep -v "libata" >> /tmp/modules-sorted
grep "block/" /tmp/modules-stripped | grep "sx8" >> /tmp/modules-sorted
grep "net/" /tmp/modules-stripped | grep -v "wireless/" | grep -v "usb/" >> /tmp/modules-sorted
grep "wireless/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "staging/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "pcmcia/" /tmp/modules-stripped >> /tmp/modules-sorted

# speed up usb module loading
grep "usb-storage" /tmp/modules-stripped >> /tmp/modules-sorted
grep "usblp" /tmp/modules-stripped >> /tmp/modules-sorted
grep "usbhid" /tmp/modules-stripped >> /tmp/modules-sorted
grep "usb/" /tmp/modules-stripped | grep -v "usb-storage" | grep -v "usbhid" | grep -v "usblp" >> /tmp/modules-sorted
grep "firewire/" /tmp/modules-stripped >> /tmp/modules-sorted
grep "ieee1394/" /tmp/modules-stripped >> /tmp/modules-sorted

# add scsi and virtio device modules at the end
grep "virtio_blk" /tmp/modules-stripped >> /tmp/modules-sorted
grep "sd_mod" /tmp/modules-stripped >> /tmp/modules-sorted
grep "sr_mod" /tmp/modules-stripped >> /tmp/modules-sorted
grep "/st.ko" /tmp/modules-stripped >> /tmp/modules-sorted
grep "/sg.ko" /tmp/modules-stripped >> /tmp/modules-sorted


sed -ne "s#^insmod.*/\(.*\)\.ko.*#\1#p" /tmp/modules-sorted >> /tmp/moduleslist

listmods() {
	key=$1 ; shift
	ex=
	while [ "$1" ]; do
		[ "$ex" ] && ex="$ex|$1" || ex="$1"
		shift
	done
	for ln in $(grep "$key" /tmp/modules-sorted | sed 's|^insmod ||g'); do
		if [ "$ex" ]; then
			echo $ln | egrep -v "$ex" | sed -ne "s#^/.*/\(.*\)\.ko.*#\1#p"
		else
			echo $ln | sed -ne "s#^/.*/\(.*\)\.ko.*#\1#p"
		fi
	done
}
showlist() {
	cat=$1 ; shift
	[ $# -gt 0 ] || return
	echo -n "$cat: "
	for i in $*; do echo -n "$i "; done
	echo ""
}

showlist2() {
	cat=$1 ; shift
	[ $# -gt 0 ] || return
	echo -n "$cat="
	for i in $*; do echo -n "$i "; done
	echo ""
}

showlist3() {
	cat=$1 ; shift
	[ $# -gt 0 ] || return
	for i in $*; do echo -n "$i "; done
	echo ""
}

showlist4() {
	cat=$1 ; shift
	[ $# -gt 0 ] || return
	echo -n "$cat=(\${MODULES[*]} "
	lsmod > /tmp/modules-showlist4-$$
	for i in $*; do
		if ! grep -sq $(echo $i|tr - _) /tmp/modules-showlist4-$$ ; then
			echo -n "$i ";
		fi
	done
	echo ")"
	rm /tmp/modules-showlist4-$$
}

# starting different actions
while [ -n "$*"  ]; do
	case $1 in
		--load-modules)
			# load all detected pci modules
			for i in $(cat /tmp/moduleslist); do
				modprobe $i > /dev/null 2>&1
			done
			;;

		--unload-modules)
			# load all detected pci modules
			for i in $(cat /tmp/moduleslist); do
				modprobe -r $i > /dev/null 2>&1
			done
			;;

		--show-modules)
			showlist "AGP    " $(listmods agp/)
			showlist "ACPI   " $(listmods acpi/)
			showlist "BLOCK  " $(listmods ata/pata pata_acpi) $(listmods ata/ata_piix) \
						  $(listmods virtio/virtio_pci) $(listmods scsi/) $(listmods message/fusion/) $(listmods drivers/block/ nbd pktcdvd sx8 floppy) \
						  $(listmods ata/ pata ata_generic) $(listmods drivers/block/sx8) \
						  $(listmods usb/ usb/input) $(listmods firewire/) $(listmods ieee1394/)
			showlist "NET    " $(listmods net/ irda/)
			showlist "DRM    " $(listmods drm/)
			showlist "INPUT  " $(listmods input/ pcspkr) $(listmods hid/)
			showlist "IRDA   " $(listmods irda/)
			showlist "ISDN   " $(listmods isdn/)
			showlist "PCMCIA " $(listmods pcmcia/)
			showlist "SOUND  " $(listmods pcspkr) $(listmods sound/)
			showlist "STAGING" $(listmods staging/)
			showlist "OTHER  " $(listmods modules/ agp/ acpi/ scsi/ message/fusion block/sx8 block/cciss block/cpqarray block/DAC960 block/virtio virtio/virtio_pci ata/ usb/ ieee1394 net/ isdn/ input/ irda/ pcmcia/ sound/ drm/ firewire/ hid/ staging/)
			;;

		--show-modules-order)
			showlist "MODULES ORDER" $(listmods modules/)
			;;

		--show-agp)    showlist "AGP    " $(listmods agp/) ;;
		--show-acpi)   showlist "ACPI   " $(listmods acpi/) ;;
		--show-block)  showlist "BLOCK  " $(listmods ata/pata pata_acpi) $(listmods ata/ata_piix) \
						  $(listmods virtio/virtio_pci) $(listmods scsi/) $(listmods message/fusion/) $(listmods drivers/block/ nbd pktcdvd sx8 floppy) \
						  $(listmods ata/ pata ata_generic) $(listmods drivers/block/sx8) \
						  $(listmods usb/ usb/input) $(listmods firewire/) $(listmods ieee1394/) ;;
		--show-net)    showlist "NET    " $(listmods net/ irda/) ;;
		--show-input)  showlist "INPUT  " $(listmods input/ pcspkr) $(listmods hid/) ;;
		--show-irda)   showlist "IRDA   " $(listmods irda/) ;;
		--show-isdn)   showlist "ISDN   " $(listmods isdn/) ;;
		--show-pcmcia) showlist "PCMCIA " $(listmods pcmcia/) ;;
		--show-sound)  showlist "SOUND  " $(listmods pcspkr) $(listmods sound/) ;;
		--show-staging) showlist "STAGING" $(listmods staging/) ;;
		--show-drm)  showlist "DRM  " $(listmods drm/) ;;
		--show-other)  showlist "OTHER  " $(listmods .ko agp/ acpi/ scsi/ message/fusion block/sx8 block/cciss block/cpqarray block/DAC960 block/virtio virtio/virtio_pci ata/ usb/ ieee1394 net/ isdn/ input/ irda/ pcmcia/ sound/ drm/ firewire/ hid/ staging/) ;;
		--filesystem)   FILESYSTEM="ext2 ext3 ext4 nilfs2 btrfs reiserfs xfs jfs vfat"
				for i in $FILESYSTEM; do
					 [ "$(grep $i /tmp/.blkid)" ] && FS="$FS $i"
				done
				[ "$(echo $FS | grep btrfs)" ] && FS="$FS crc32c"
				MODULES_INITRAMFS="$MODULES_INITRAMFS $FS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--hostcontroller)HOSTCONTROLLER="$(listmods virtio/virtio_pci) $(listmods ata/pata pata_acpi) $(listmods scsi/ /sg.ko /st.ko scsi_mod sr_mod sd_mod) $(listmods message/fusion/) $(listmods drivers/block/ virtio_blk nbd pktcdvd sx8 floppy) $(listmods ata/ pata ata_generic) $(listmods drivers/block/sx8) $(listmods xhci-hcd) $(listmods ehci-hcd) $(listmods uhci-hcd) $(listmods ohci-hcd) $(listmods virtio_blk)"
				 MODULES_INITRAMFS="$MODULES_INITRAMFS $HOSTCONTROLLER"
				 showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				 ;;
		--ati-kms) 	KMS="radeon"
				MODULES_INITRAMFS="$KMS $MODULES_INITRAMFS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--intel-kms) 	KMS="i915"
				MODULES_INITRAMFS="$KMS $MODULES_INITRAMFS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--nvidia-kms) 	KMS="nouveau"
				MODULES_INITRAMFS="$KMS $MODULES_INITRAMFS"
				showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--uvesafb) 	FB="uvesafb"
				MODULES_INITRAMFS="$FB $MODULES_INITRAMFS"
				! [ "$HOOKS" = "1" ] && showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--fbmodule) 	FB=""
				for i in $(cat /etc/modprobe.d/framebuffer_blacklist.conf); do
				    i=$(echo $i | sed -e 's/blacklist //g')
				    # check if already in FB array, to avoid double entries
				    if [ "$(cat /proc/modules | grep ^$i)" ]; then
					! [ "$(grep -w $FB)" ] && FB="$i"
				    fi
                                done
				MODULES_INITRAMFS="$FB $MODULES_INITRAMFS "
				! [ "$HOOKS" = "1" ] && showlist2 "MODULES" \"$MODULES_INITRAMFS\" | sed -e 's/(\  /(/g' -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
				;;
		--modules) showlist2 "MODULES" \($(listmods modules/)\) | sed -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
			 ;;
		--modules-not-loaded) showlist4 "MODULES" $(listmods modules/) | sed -e 's/(\ /(/g' -e 's/\ )/)/g' -e 's/\ \ /\ /g'
			 ;;
		--hooks) 
			if [ "$HOOKS_DIR" = "" ]; then
				HOOKS_DIR="/usr/lib/initcpio/install"
			fi
			START_HOOKS="base v86d udev keymap autodetect modconf block pcmcia net dmraid keyboard $ADVANCED btrfs filesystems fsck shutdown"
			# remove the ones that don't exist on the system
			for i in ${START_HOOKS}; do
				if ! [ -e "${HOOKS_DIR}/$i" ]; then 
					START_HOOKS=$(echo $START_HOOKS | sed -e "s/${i}\ //g")
				fi
			done
			if ! [ "$KEYMAP" = "1" ]; then 
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/keymap//g")
			fi
			if ! [ "$UVESAFB" = "1" ]; then 
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/v86d//g")
			fi
			if ! [ "$DMRAID" = "1" ]; then 
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/dmraid//g")
			fi
			if ! [ "$PCMCIA" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/pcmcia//g")
			fi
			if ! [ "$NFS" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/net//g")
			fi
			if ! [ "$BTRFS" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/btrfs//g")
			fi
			if ! [ "$SHUTDOWN" = "1" ]; then
				START_HOOKS=$(echo $START_HOOKS | sed -e "s/shutdown//g")
			fi
			echo "HOOKS=\"$START_HOOKS\"" | sed -e 's/"\ /"/g' -e 's/\ "/"/g' -e 's/\ \ /\ /g'
		;;
		--advanced) ADVANCED_ARCHBOOT=""
			    for i in $ADVANCED; do
				ADVANCED_ARCHBOOT="$ADVANCED_ARCHBOOT $(echo arch_$i)"
			    done
			    echo "$ADVANCED_ARCHBOOT"
			    ;;
	esac
	shift
done

# cleanup
rm /tmp/modules-plain
rm /tmp/modules-sorted
rm /tmp/modules-stripped
rm /tmp/moduleslist

# vim: set ts=2 sw=2 noet:
